/**
 *
 * (重点)
 * 一.1哈希算法：(md5为例)这是不可逆的，只能单向的,如果指明使用hex 十六进制的字符串表示，它的加密结果都是32位
 * 
 *              md5update可多次执行，
 * 
 *   
 * 
 *   比方数据： demo  ----》 加密串 
 * 
 * 
 *   正常数据用户名密码中密码大多数是 md5加密的
 * 
 *   使用的场景：数据库密码字段设计，支付中做数据的摘要.
 * 
 *   
 * 
 * 
 */
/**
 * 可以使用常量去接收 require 的返回值
 */
//引入模块 
const crypto = require('crypto');
//创建个md5算法
//let hash = crypto.createHash('md5');
//数据的单向加密
// let str1='thisisnode';
// //具体的加密
// hash.update(str1);//update可执行多次
// let encodeStr=hash.digest('hex');
// console.log(encodeStr.length);//十六进制的字符串表示

//数据的单向加密
// let str2='thisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnodethisisnode';
// hash.update(str2);//update可执行多次
// let encodeStr2=hash.digest('hex');
// console.log(encodeStr2.length);//十六进制的字符串表示

//比方一个字符串 123456789,可分割为 123+456+789
// let totalStr = '123456789';
// let str1 = '12';
// let str2 = '3456';
// let str3 = '789';
//hash.update(totalStr);//update 就是md5单项加密的主逻辑  123456789 整个字符串密码结果为：25f9e794323b453885f5181f1b624d0b
//console.log(hash.digest('hex'));//
// hash.update(str1);
// hash.update(str2);
// hash.update(str3);
// console.log(hash.digest('hex'));    //加密结果：123456789的分段加密结果为:                25f9e794323b453885f5181f1b624d0b

//把一个字符串整体加密（一次update），和分段加密（分段可以任意分割，多次update） 结果是一致的.

/**
 * 哈希算法2.sha1,与md5大体类似，如制定16进制显示的话，返回40位长度的字符串
 *
 *
 */
//创建个sha1算法
// let hash=crypto.createHash('sha1');

// hash.update('sha1thisisisisfdfdsfdsfdsfdsfdsfdsfds32432432432fdsfr231432ds');
// console.log(hash.digest('hex').length);

/**
 * 了解下
 * 二.加解密算法:
 *             一.对称加密：就是加密与解密的 秘钥一致，简单的说就是 加密时用到的 密码，与解密时用到的 密码一致
 *
 *             二.非对称加密：就是加密与解密的 秘钥不一致，简单的说就是 加密时用到的 密码，与解密时用到的 密码不一致
 *
 *
 *
 *
 */

/**
 * 对称加密的算法一.AES,具体的实现在 crpto中已有
 *
 *
 */

/*对称加解密要稍微封装*/

/**
 * 加密函数
 * data 被加密的数据
 * key  就是密码
 */

function aesEncrypt(data,key){
    /**
     * 1.通过 crypto ,与key 创建一个ciper暗号
     * createCipheriv(algorithm，key)
     * algorithm 加密类型
     * key       密码
     */
    let ciper=crypto.createCipher('aes192',key);
    //把数据加密
    //update 有多种方法
    //推荐   update(data, inputEncoding, outputEncoding)
    /**
     *       data 要加密的数据
     *       inputEncoding 输入的编码，其实就是data的编码
     *       outputEncoding 输出的编码，正常我们都使用hex 16进制的输出
     */
    let returnStr=ciper.update(data,'utf8','hex');
    //加入结尾符
    let final=ciper.final('hex');
    returnStr=returnStr+final;
    return returnStr;
}

console.log(aesEncrypt('hellword','node'));

/**
 * aes 解密
 * 
 */

function aesDecrypt(encrypted,key){

    /**创建一个解密 */
    const deciper=crypto.createDecipher('aes192',key);
    /**
     *  update(data: string, inputEncoding: Encoding | undefined, outputEncoding: Encoding): string;
     *  data 就是被加密的字符串，inputEncoding 这个加密的字符的字符串一般椒16进制字符串，outputEncoding 输出的字符串类型一般utf8
     */
    let descrped = deciper.update(encrypted,'hex','utf8');
    descrped+=deciper.final('utf8')
    return descrped;
}
let encrypted='ffd218a2ad04c95688534f4bd30a1c5d';
let key='node'
console.log(aesDecrypt(encrypted,key));

/**
 * 非对称加密：加解密的key是不一样的
 * 
 * RSA 非对称加解密
 * 
 * 应用场景：支付，https
 * 
 */

/**
 * 作业：
 * 结合数据库与md5设计一个用户表（user），有用户名字段username与password字段还可以有别的字段，password字段采用md5(16进制 hex)加密，
 * 实现增加数据(写入数据时password采用md5加密)，与查询数据（查询数据时，通过明文md5加密查询);
 * 
 * 
 */















